#include <iostream>
#include "common.h"

namespace FUNC_POINTER_DAY25
{
    // 声明一个函数指针类型
    typedef void (*FunctionPtr)(int);

    // 函数接受一个函数指针作为参数
    void doSomething(FunctionPtr func) {
        // 调用传入的函数指针
        func(42);
    }

    // 定义一个具体的函数
    void myFunction(int value) {
    std::cout << "Value: " << value << std::endl;
    }

};

namespace FUNC_OBJ_DAY25
{
    // 定义一个类作为可调用对象（仿函数）,这里定义类和结构体相同，需要注意类要设置public
    class MyFunctor {
        public:

            // 重载运算符
            void operator()(int value) const {
                std::cout << "Value: " << value << std::endl;
            }
    };

    // 函数接受一个可调用对象作为参数
    void doSomething(const MyFunctor& func) {
        // 调用传入的可调用对象
        func(42);
    }
};

int main() {

    {
        __LOG__("函数指针的传递");
        using namespace FUNC_POINTER_DAY25;
        // 将具体的函数传递给doSomething()
        doSomething(myFunction);
    }

    {
        __LOG__("函数对象的传递-仿函数");
        using namespace FUNC_OBJ_DAY25;
        // 创建一个函数对象（仿函数）并将其传递给doSomething()
        MyFunctor functor;
        doSomething(functor);
    }
    

return 0;
}